<?php

error_reporting(E_ALL | E_STRICT);

$_base_dir = url_dirname(__FILE__, 2);


global $config;
$config = array(
	'php_version'    => '5.2.0',
	'php_extensions' => array(
			'curl',
			'date',
			'dom',
			'gd',
			'iconv',
			'mbstring',
			'mysql',
			'pcre',
			'spl',
			//'session',
			'tokenizer',
			//'xsl',
	),
	'mysql_version'  => '5.0.0',

	'dir.install'    => $_base_dir,
	'dir.localstate' => $_base_dir.'var/',
	'dir.data'       => $_base_dir.'data/',
	'dir.cache'      => $_base_dir.'var/cache/',
	'dir.store'      => $_base_dir.'var/store/',
	'dir.config'     => $_base_dir.'etc/',
	'dir.conf.d'     => $_base_dir.'etc/conf.d/',

	'form' => array(
		'type' => 'form',
		'title' => 'Инсталлятор',
		'action' => $_SERVER['REQUEST_URI'],
		'fields' => array(
			'admin' => array(
				'type' => 'fieldset',
				'title' => 'Настройки администратора',
				'fields' => array(
					'admin_email' => array(
						'type' => 'text',
						'title' => 'Email администратора узла',
						'description' => 'используется в качестве логина',
						'validator' => 'install_validate_not_empty',
					),
					'admin_password' => array(
						'type' => 'text',
						'title' => 'Пароль администратора узла',
						//'description' => 'обычно не определяется автоматически',
						'validator' => 'install_validate_not_empty',
					),
				),
			),
			'db' => array(
				'type' => 'fieldset',
				'title' => 'База данных',
				'description' => 'Настройки подключения к базе данных',
				'fields' => array(
					'db_host' => array(
						'type' => 'text',
						'title' => 'Сервер БД',
						'default' => 'localhost',
						'description' => 'адрес сервера БД',
					),
					'db_name' => array(
						'type' => 'text',
						'title' => 'Имя БД',
						'description' => 'база данных должна существовать',
						'default' => '',
					),
					'db_user' => array(
						'type' => 'text',
						'title' => 'Пользователь БД',
						'default' => 'root',
					),
					'db_password' => array(
						'type' => 'text',
						'title' => 'Пароль БД',
						'default' => '',
					),
				),
				'validator' => 'install_validate_db',
			),
			'site' => array(
				'type' => 'fieldset',
				'title' => 'Настройки сайта',
				'fields' => array(
					'project_title' => array(
						'type' => 'text',
						'title' => 'Название узла',
						'default' => 'Платоника',
					),
					'base_path' => array(
						'type' => 'text',
						'title' => 'Путь к сайту',
						'description' => 'обычно определяется автоматически',
						'default' => 'install_get_base_path',
					),
				),
			),
		),
		'buttons' => array(
			'ok' => array(
				'type' => 'image',
				'title' => 'Установить',
				'src' => '../skins/platonica/images/title/button-install.gif',
			),
		),
	),

	'configs' => array(
		array('from' => $_base_dir.'.htaccess.sample',         'to' => $_base_dir.'.htaccess'),
		array('from' => $_base_dir.'etc/config.php.sample',    'to' => $_base_dir.'etc/config.php'),
		array('from' => $_base_dir.'etc/conf.d/db.php.sample', 'to' => $_base_dir.'etc/conf.d/db.php'),
	),

);


function handle ()
{
	$start = microtime(true);
	request_init();
	$action = request_get_param('action', 'check');
	$f = 'handle_'.$action;
	$h = $f.'_'.$_SERVER['REQUEST_METHOD'];

	ob_start();
			if     (is_callable($h)) $h();
			elseif (is_callable($f)) $f();
			$body =
	ob_get_clean();

	if (!$body) $body = 'Привет';

	$env['body'] = $body;
	disp_html($env);
	//echo sprintf("%.4f\n", microtime(true) - $start);
} // end of function main

function handle_check ()
{
	global $config;
	ob_start();
	$s = install_basic_test($config);
	$test_log = ob_get_clean();

	if (!$s) { // что-то не правильно
		disp_installation_failed();
		echo $test_log;
		return;
	}

	// предварительные тесты прошли успешно, рисуем форму для ввода данных
	$form = $config['form'];
	init_form($form);
	disp_form($form);
	echo $test_log;
	return;
} // end of function handle_check
function handle_check_POST()
{
	global $config;
	$form = $config['form'];
	init_form($form);
	process_form($form);
	if ($form['status'] === 'ok') {
		$configs = $config['configs'];
		$xs = $form['vhash'];
		$xs['project_key'] = md5(uniqid().time());
		$xs['admin_password'] = md5($xs['admin_password'].$xs['project_key']);

		ob_start();
		$s = install_basic_test($config);
		foreach ($configs as $cfg) {
			$s &= !(bool)install_write_config($cfg['from'], $cfg['to'], $xs);
		}
		if ($s) {
			$http_code = install_navigate('initdb?digest='.urlencode($xs['project_key']), $out);
			if ($s &= disp_assert($http_code == 200, sprintf('Скорее всего у вас не настроен mod_rewrite'))) {
				$s &= disp_assert($out === 'Ok', sprintf("Init db %s", request_get_param('debug') ? $out : ''));
			}
		}

		$test_log = ob_get_clean();
		if ($s) {
			request_redirect('?action=ok');
		} else {
			//request_redirect('?action=failed');
			// cleanup configs
			if (!request_get_param('debug')) {
				foreach ($config['configs'] as $cfg) {
					@unlink($cfg['to']);
				}
			}
			disp_installation_failed();
			echo $test_log;
			return;
		}
	} else {
		disp_form($form);
	}
}
function handle_ok ()
{
	disp_installation_success();
} // end of function handle_ok
function handle_failed ()
{
	disp_installation_failed();
} // end of function handle_ok

function install_basic_test ($config)
{
	$s = true;
	// PHP Version
	$s &= disp_check_php($config['php_version']);

	// PHP extensions
	foreach ($config['php_extensions'] as $v) {
		$s &= disp_check_extension($v);
	}

	// is Apache
	//$server_software = isset($_SERVER['SERVER_SOFTWARE']) ? strtolower($_SERVER['SERVER_SOFTWARE']) : '';
	//$s &= disp_assert(strpos($server_software, 'apache') !== false, sprintf('Web server is "%s"', $server_software));

	// Directories
	$s &= disp_check_directory($config['dir.install']) && disp_check_writable($config['dir.install']);
	$s &= disp_check_directory($config['dir.localstate']) && disp_check_writable($config['dir.localstate']);
	$s &= disp_check_directory($config['dir.data']) && disp_check_writable($config['dir.data']);

	$t = $config['dir.data'].'/thumbs';
	if (!is_dir($t)) {
		$s &= disp_assert(@mkdir($t, 0777),
		sprintf('Создание директории "%s"', $t));
	}
	if (!is_dir($config['dir.cache'])) {
		$s &= disp_assert(@mkdir($config['dir.cache'], 0700),
		sprintf('Создание директории "%s"', $config['dir.cache']));
	}
	$s &= disp_check_directory($config['dir.cache']) && disp_check_writable($config['dir.cache']);

	if (!is_dir($config['dir.store'])) {
		$s &= disp_assert(@mkdir($config['dir.store'], 0700),
		sprintf('Создание директории "%s"', $config['dir.store']));
	}
	$s &= disp_check_directory($config['dir.store']) && disp_check_writable($config['dir.store']);
	$s &= disp_check_directory($config['dir.config']) && disp_check_writable($config['dir.config']);
	$s &= disp_check_directory($config['dir.conf.d']) && disp_check_writable($config['dir.conf.d']);

	// Config templates as destinations
	foreach ($config['configs'] as $cfg) {
		$s &= disp_assert(is_readable($cfg['from']),
			sprintf('Не могу прочитать файл "%s"', $cfg['from'])
		);
		$s &= disp_assert(!(bool)@stat($cfg['to']),
			sprintf('Файл уже существует "%s"', $cfg['to'])
		);
		$s &= disp_check_writable($cfg['to']);
	}

	$s &= disp_assert(function_exists('imagecreatefromjpeg'),
		sprintf('Отсутсвует поддержка изображений в формате JPEG')
	);
	$s &= disp_assert(function_exists('imagecreatefrompng'),
		sprintf('Отсутсвует поддержка изображений в формате PNG')
	);
	$s &= disp_assert(function_exists('imagecreatefromgif'),
		sprintf('Отсутсвует поддержка изображений в формате GIF')
	);

	return $s;
} // end of function install_basic_test

function url_dirname($path, $level=1)
{
	//$path = preg_replace('#\\\\+|/+#', '/', $path);
	while ($level-- > 0) $path = dirname($path);
	if (strpos($path, '\\') !== false) $path = str_replace('\\', '/', $path);
	return $path === '/' ? $path : $path . '/';
}
function install_get_base_path ()
{
	return url_dirname(request_get_base_path());
} // end of function install_get_base_path
function install_get_base_url ()
{
	return url_dirname(request_get_base_url());
} // end of function install_get_base_url
function install_navigate ($url, &$out=NULL)
{
	$us = parse_url($url);
	if (!isset($us['scheme']) || !$us['scheme']) {
		$url = install_get_base_url() . $url;
	}
	return navigate($url, $out);
} // end of function install_navigate
function install_validate_db ($name, &$config)
{
	$xs = $config['form']['vhash'];
	$db = @mysql_connect($xs['db_host'], $xs['db_user'], $xs['db_password']);
	if (!$db) {
		return sprintf('Не могу подключиться к серверу MySQL. Сообщение сервера: "%s".', mysql_error());
	}
	$rs = @mysql_select_db($xs['db_name'], $db);
	if (mysql_error($db)) {
		return sprintf('Не могу выбрать базу данных. Сообщение сервера: "%s".', mysql_error($db));
	}

	// MySQL version check
	$mysql_min_version = '5.0.0';
	$str = mysql_get_server_info($db);
	if (!preg_match('#([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)#', $str, $ms)) {
		return sprintf('Не могу определить версию сервера MySQL. Версия вашего SQL сервера "%s".', $str);
	}
	if (version_compare($mysql_min_version, $ms[1]) > 0) {
		return sprintf('Версия сервера MySQL должна быть не ниже "%s", а сейчас "%s".', $mysql_min_version, $ms[1]);
	}

	// InnoDB check at MySQL server
	if (!($rs = mysql_query("SHOW VARIABLES LIKE 'have_innodb'", $db))) {
		return sprintf('Не могу получить доступ к переменным сервера MySQL');
	}
	$mvars = array();
	while ($row = mysql_fetch_array($rs)) {
		list($name, $value) = $row;
		$mvars[$name] = $value;
	}
	if (!isset($mvars['have_innodb']) || $mvars['have_innodb'] !== 'YES') {
		return sprintf('Сервер MySQL не поддерживает InnoDB');
	}

} // end of function install_validate_db
function install_validate_not_empty ($name, &$config)
{
	if (!$config['value']) return 'Поле обязательно для заполнения';
} // end of function install_validate_not_empty
function install_write_config ($from, $to, $env)
{
	global $config;
	$status = 0;
	do {
		// проверить наличие файла шаблона.
		if (!file_exists($from)) { $status = "Не могу открыть шаблон конфигурационного файла \"$from\""; break; }
		// скорпировать шаблон в файл конфига.
		if (!copy($from, $to))   { $status = "Не могу создать конфигурационный файл \"$to\""; break; }
		// проапдейтить конфиг значениями параметров из формы.
		if (preg_match('#\.php$#', $to)) {
			// *.php configs
			require_once $config['dir.install'].'admin/lib/PhpDocParser.php';
			require_once $config['dir.install'].'admin/lib/ConfigPhp.php';
			$cfg = new ConfigPhp(array('source'=>$to));
			foreach ($env as $k=>$v) {
				$cfg->setParam($k, $v);
			}
		} else {
			// .htaccess
			$source = file_get_contents($to);
			foreach ($env as $k=>$v) {
				$search[] = '{{'.$k.'}}';
				$replace[] = $v;
			}
			$source = str_replace($search, $replace, $source);
			if (file_put_contents($to, $source) === false) { $status = "Не могу записать конфигурацонный файл \"$to\""; break; }
		}
	} while (false);
	return $status;
} // end of function install_write_config

function check_extension($name)
{
	if (!extension_loaded($name)) {
		$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
		if (ini_get('enable_dl') && @dl($name)) {
			config_write_code('@dl("'.$prefix.$name.'.'.PHP_SHLIB_SUFFIX.'");');
		} else {
			return false;
		}
	}
	return true;
}

function php_is_writable ($path)
{
	if (is_dir($path))
		return php_is_writable(rtrim($path, '\\/') .'/'.uniqid(time().rand()).'.tmp');
	// tmp file for read/write capabilities
	$rm = file_exists($path);
	$f = @fopen($path, 'a');
	if ($f===false)
		return false;
	fclose($f);
	if (!$rm)
		unlink($path);
	return true;
} // end of function php_is_writable

function navigate ($url, &$out=NULL)
{
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	$out = curl_exec($ch);
	$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
	curl_close($ch);
	return $http_code;
} // end of function navigate

function request_init($config=array())
{
	/**
	 * удаляем "магические" квоты из предоставленного массива и всех содержащихся в нём массивов
	 *
	 * gpc - GET, POST, COOKIE
	 */
	if (get_magic_quotes_gpc()) {
		function request_fuckQuotes( array &$a )
		{
			foreach($a as $k => $v) {
				if(is_array($v)) {
					request_fuckQuotes( $a[$k] );
				}	else {
					$a[$k] = stripslashes($v);
				}
			}
		}
		request_fuckQuotes($_GET);
		request_fuckQuotes($_POST);
		request_fuckQuotes($_COOKIE);
		request_fuckQuotes($_REQUEST);
	}
	$_GPC_OFF = true;
	if (!isset($_SERVER['JT_HOST']) || !isset($_SERVER['JT_PORT'])) {
		$server = explode(':', $_SERVER['HTTP_HOST'], 2);
		if (count($server) == 2) {
			$server_host = $server[0];
			$server_port = intval($server[1]);
		} else {
			$server_host = $server[0];
			$server_port = 80;
		}
		if (!isset($_SERVER['JT_HOST'])) { $_SERVER['JT_HOST'] = $server_host; }
		if (!isset($_SERVER['JT_PORT'])) { $_SERVER['JT_PORT'] = $server_port; }
	}
	if (!isset($_SERVER['JT_SCHEME'])) {
		$_SERVER['JT_SCHEME']
			= strtolower(substr($_SERVER['SERVER_PROTOCOL'], 0, strpos($_SERVER['SERVER_PROTOCOL'], '/')));
	}
	// вычисляем base_url
	if (!isset($_SERVER['JT_SERVER']) ) {
		$_SERVER['JT_SERVER'] =
			$_SERVER['JT_SCHEME'] . '://' . $_SERVER['JT_HOST'] . ($_SERVER['JT_PORT'] === 80 ? '' : ':'.$_SERVER['JT_PORT']);
	}
	if (!isset($_SERVER['JT_BASE_PATH'])) {
		$_SERVER['JT_BASE_PATH'] = url_dirname($_SERVER['SCRIPT_NAME']);
	}
	if (!isset($_SERVER['JT_BASE_URL'])) {
		$_SERVER['JT_BASE_URL'] = $_SERVER['JT_SERVER'] . $_SERVER['JT_BASE_PATH'];
	}
}
function request_redirect ($url)
{
	if ($url[0] === '?') {
		$url = $_SERVER['SCRIPT_NAME'] . $url;
	}
	header('Location: '.$url);
	die();
} // end of function request_redirect
function request_get_param($name, $default=NULL)
{
	if (isset($_REQUEST[$name])) { return $_REQUEST[$name]; }
	else { return $default; }
}
function request_get_base_path ()
{
	return $_SERVER['JT_BASE_PATH'];
} // end of function request_get_base_path
function request_get_base_url ()
{
	return $_SERVER['JT_BASE_URL'];
} // end of function request_get_base_url

global $CONFIG;
if (!isset($CONFIG)) $CONFIG='';
function config_write_code ($code)
{
	global $CONFIG;
	$CONFIG .= $code ."\n";
} // end of function config_write_op
function config_write_param ($name, $value)
{
	config_write_code("\$config['$name'] = $value;\n");
} // end of function config_write_op
function config_write_param_string ($name, $value)
{
	$value = str_replace('\\', '\\\\', $value);
	$value = str_replace("'", "\'", $value);
	config_write_code("\$config['$name'] = '$value';\n");
} // end of function config_write_op

function form_name2title ($name)
{
	$parts = explode('_', $name);
	if ($parts) {
		$parts[0] = ucfirst($parts[0]);
	}
	return implode(' ', $parts);
} // end of function form_name2string
function init_form_field ($name, &$config)
{
	if (!isset($config['title'])) $config['title'] = form_name2title($name);
	if (!isset($config['description'])) $config['description'] = NULL;
	if (!isset($config['status'])) $config['status'] = NULL;
	if (!isset($config['status_message'])) $config['status_message'] = NULL;
	if (isset($config['default'])) { $m = $config['default']; $config['value'] = is_callable($m) ? $m($config) : $m; }
	else { $config['value'] = NULL; }
} // end of function init_form_field
function init_form_field_text ($name, &$config)
{
	init_form_field($name, $config);
} // end of function init_form_field_text
function init_form_field_hidden ($name, &$config)
{
	init_form_field($name, $config);
} // end of function init_form_field_text
function init_form_field_fieldset ($name, &$config)
{
	init_form_field($name, $config);
	init_form_fields($name, $config);
} // end of function init_form_field_text
function init_form_fields ($name, &$config)
{
	foreach ($config['fields'] as $field_name => &$field_config) {
		$field_config['form'] =& $config['form'];
		//$field_config['form']['hash'][$field_name] =& $field_config;
		$disp_f = 'init_form_field';
		if (isset($field_config['type'])) $disp_f .= '_'.$field_config['type'];
		$disp_f($field_name, $field_config);
	}
} // end of function init_form_fields
function init_form (&$config)
{
	$config['form'] =& $config;
	$config['status'] = 'ok';
	//init_form_buttons('', $config);
	init_form_fields('', $config);
} // end of function init_form

function process_form(&$config)
{
	process_form_fields('', $config);
}
function process_form_fields ($name, &$config)
{
	foreach ($config['fields'] as $field_name => &$field_config) {

// process field
		$f = 'process_form_field';
		if (isset($field_config['type'])) $f .= '_'.$field_config['type'];
		$f($field_name, $field_config);
	}
} // end of function process_form_fields
function process_form_field_fieldset ($name, &$config)
{
	process_form_fields($name, $config);
	process_form_field($name, $config);
} // end of function process_form_field_fieldset
function process_form_field_text ($name, &$config)
{
	$config['new_value'] = isset($_POST[$name]) ? $_POST[$name] : NULL;
	process_form_field($name, $config);
} // end of function process_form_field_text
function process_form_field_hidden ($name, &$config)
{
	$config['new_value'] = isset($_POST[$name]) ? $_POST[$name] : NULL;
	process_form_field($name, $config);
} // end of function process_form_field_text
function process_form_field($name, &$config)
{
	$has_value = isset($config['value']);
	$has_new_value = isset($config['new_value']);

// save old field 'value' as 'old_value'
	if ($has_value) {
		$config['old_value'] = $config['value'];
	}

// set new field 'value', if exists
	if ($has_new_value) {
		$is_validation_needed = ($config['value'] !== $config['new_value']);
		$config['value'] = $config['new_value'];
	} else {
		$is_validation_needed = !isset($config['value']);
	}

// validate field, if needed
	if (isset($config['validator']) && $is_validation_needed) {
		$f = $config['validator'];
		$is_invalid = $f($name, $config);
	} else {
		$is_invalid = false;
	}
	if ($is_invalid) {
		$config['status'] = 'error';
		$config['status_message'] = $is_invalid;
		$config['form']['status'] = 'error';
	}

// put current (default/old/new) field 'value' in the form hash
	if (array_key_exists('value', $config)) {
		$config['form']['vhash'][$name] = $config['value'];
	}
}


function disp_success($msg)
{
	if (request_get_param('debug')) {
		echo "<div>$msg [Ok]</div>";
	}
	return true;
}
function disp_fail($msg)
{
	echo "<div class=\"error\">$msg [Failed]</div>";
	return false;
}
function disp_check_extension($name)
{
	return disp_assert(check_extension($name), "PHP extension '$name'");
}
function disp_check_php($min_version)
{
	return disp_assert(version_compare(PHP_VERSION, $min_version) >= 0, "PHP version ".PHP_VERSION);
}
function disp_check_directory ($path)
{
	return disp_assert(is_dir($path), "Is directory \"$path\"");
} // end of function disp_check_writable_directory
function disp_check_writable ($path)
{
	return disp_assert(php_is_writable($path), "Is writable \"$path\"");
} // end of function disp_check_writable
function disp_assert ($bool, $message, $fail_message=NULL)
{
	if ($bool) disp_success($message);
	else disp_fail(isset($fail_message) ? $fail_message : $message);
	return $bool;
} // end of function disp_assert

function disp_form_fields ($config)
{
	foreach ($config['fields'] as $field_name => $field_config) {
		$disp_f = 'disp_form_field_'.$field_config['type'];
		$disp_f($field_name, $field_config);
	}
} // end of function disp_form_fields
function disp_form_buttons ($config)
{
	foreach ($config['buttons'] as $field_name => $field_config) {
		$disp_f = 'disp_form_button_'.$field_config['type'];
		$disp_f($field_name, $field_config);
	}
} // end of function disp_form_fields

function disp_form ($config)
{
?>
		<h1><?=$config['title']?></h1>
		<form action="<?=$config['action']?>" method="POST">
			<?=disp_form_fields($config)?>
			<?=disp_form_buttons($config)?>
		</form>
<?php
}
function disp_form_field_fieldset ($name, $config)
{
?>
		<fieldset id="<?=$name?>" name="<?=$name?>">
			<legend><?=$config['title']?></legend>
			<?if ($config['description']) print("<p>".$config['description']."</p>"); ?>
			<?=disp_form_fields($config)?>
			<div class="<?=$config['status']?>"><?=$config['status_message']?></div>
		</fieldset>
<?php
} // end of function disp_form_field_set
function disp_form_field_text ($name, $config)
{
?>
	<div class="field-">
		<label for="<?=$name?>"><?=$config['title']?></label>
		<input type="text" id="<?=$name?>" name="<?=$name?>" value="<?=htmlspecialchars($config['value'],ENT_QUOTES)?>" />
		<div class="desc-"><?=$config['description']?></div>
		<div class="<?=$config['status']?>"><?=$config['status_message']?></div>
	</div>
<?php
} // end of function disp_form_field_text
function disp_form_field_hidden ($name, $config)
{
?>
		<input type="hidden" id="<?=$name?>" name="<?=$name?>" value="<?=htmlspecialchars($config['value'], ENT_QUOTES)?>" />
<?php
} // end of function disp_form_field_text
function disp_form_button_image ($name, $config)
{
?>
		<input type="image" name="_<?=$name?>" src="<?=$config['src']?>" alt="<?=$config['title']?>" />
<?php
} // end of function disp_form_button_image

function disp_installation_success()
{
	$project_base_url = install_get_base_url();
?>
	<h1>Установка завершена</h1>
	<p>Мои поздравления. У Вас получилось! <a href="<?=$project_base_url?>"><?=$project_base_url?></a></p>
	<p class="dry-">С уважением, Инсталятор Платоники.</p>
	<div class="warning">
		<p>В целях безопасности, настоятельно рекомендуем удалить с сервера директорию инсталятора&nbsp;Платоники <br /><br /><strong><?=url_dirname(__FILE__)?></strong></p>
	</div>
	<a href="<?=$project_base_url?>"><img src="../skins/platonica/images/title/button-installend.gif" alt="Завершить установку" /></a>

<?php
}
function disp_installation_failed()
{
?>
		<h1>Установка невозможна</h1>
		<p>Я очень старался, но что-то пошло не так как ожидалось. Теперь вся надежда на Вас.</p>
		<p>Устраните неполадки и запустите инсталятор Платоники еще раз.</p>
		<p class="dry-">С уважением, Инсталятор Платоники.</p>
		<br /><br />
		<h1>Произошедшие ошибки</h1>
<?php
}

function disp_html ($env)
{ extract($env);
?>
		<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
		<html>
		<head>
			<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
			<title>Platonica installer</title>
			<style type="text/css">
			/* tags */

			* { margin: 0; padding: 0; font-family: Arial, sans-serif; font-size: 100.01%; }

			body { font-size: 62.5%; background: #f1f1e2; }

			td { vertical-align: top; }

			a { text-decoration: underline; }

			a:link,
			a:visited { color: #10702f; }
			a:active  { color: #c00; }
			a:hover   { color: #c00 !important; }

			img { border: none; }
			form { text-align: left; }

			/* Разметка */

			.pagehandler { min-width: 1000px; }


			.installer p { font-size: 1.3em; padding-bottom: 10px; }
			.installer fieldset p { font-size: 1em; padding-bottom: 10px; }

			.installer { padding: 20px 0; text-align: center; }
			.installer .logo- {}
			.installer .header- { margin: 20px 0; font-weight: normal; font-size: 2.4em; }
			.installer .handler- { width: 486px; margin: 20px auto; background: url(../skins/platonica/images/title/enterblock-bg-m.png) repeat-y; }
			.installer .handler- .bg1- { background: url(../skins/platonica/images/title/enterblock-bg-t.png) no-repeat 0 0; }
			.installer .handler- .bg2- { padding: 20px; background: url(../skins/platonica/images/title/enterblock-bg-b.png) no-repeat 0 100%; text-align: left; }
			.installer .handler- h1 { padding-bottom: 10px; font-size: 1.7em; text-align: center; color: #10702f; }

			.bottomlogo- { margin: 0 auto 20px; }

			.installer fieldset { margin-bottom: 20px; padding: 10px 16px 10px 10px; border: 1px solid #E2E2E2; font-size: 1.3em; }
			.installer legend { padding: 0 2px; font-weight: bold; font-size: 1.1em; color: #666; background: #fff; }
			.installer label { font-weight: bold; color: #10702f; }
			.installer fieldset  input { clear: both; width: 100%; margin: 2px 0; padding:3px 2px 4px; border: 1px solid #E2E2E2; color: #7BAC8C; background: #F6F7F9; }
			.installer .field- { padding-bottom: 10px; }
			.installer .desc- { color: #666; }
			.installer .dry- { color: #999; }


			.installer .error { font-size: 1.1em; color: #c00; }
			.installer fieldset .error { font-size: 1em; }

			.warning { margin: 10px 5px 20px 2px; padding: 5px; border: 1px dashed #ff00ff; background-color: #ffffa0; }

			</style>


		</head>
		<body id="body" class="installer">
			<img src="../skins/platonica/images/title/logo-plat.png" alt="Platonica" class="logo-" />
			<div class="handler-"><div class="bg1-"><div class="bg2-">
				<?=$body?>
			</div></div></div>
			<a href="http://platonica.ru"><img src="../skins/platonica/images/platonica-logo.gif" alt=""class="bottomlogo-" /></a>
		</body>
		</html>
<?php
} // end of function disp_html


handle();
